<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <script>
        // 严格模式

        // 1. 在 < script > 中第一行写 "use strict", 表明下面的代码使用严格模式(或者是js文件中第一行)
        // 2. 使用代码的定义， 使用更加规范， 避免一些诡异的运行行为
        // 3. 在后续的Es特性和一些Angular等JS框架中， 要求必须在严格模式下运行
        // 4. 使代码的编译和运行更加高效

        // 对变量的影响
        // 1. 变量必须要先声明再使用
        // 2. 不可以使用任意保留字 / 关键字作为变量名
        // 3. 严格模式不再允许用户删除变量(delete)

        // 对 对象的影响
        // 1. 对只读属性赋值会抛出异常
        // 2. 对不可配置的属性使用delete操作符会抛出异常
        // 3. 对不可拓展的对象添加属性， 会抛出错误
        // 4. 不可以使用with简化对象访问

        // 对函数的影响
        // 1. 在普通函数当中， 不允许使用this引用当前的window对象
        // 2. 在严格模式中， 函数的参数必须是唯一的（ 也就说不允许有重复的）
        // 3. 在严格模式中， arguments对象的值， 和形参的值是完全独立的， 虽然修改形参的值也会反映到arguments对象

        // 注意点：

        // 1. 类和模块的内部， 默认的就是严格模式， 所以不需要使用 'use strict'
        // 来指定运行模式
        // 2. 不存在变量提升
        // 3. 在类和模块 {}
        // 的内部， 默认的就是严格模式， 其实就是
        // 只要你的代码写在类或模块之中， 就只有严格模式可用。
        // 考虑到未来所有的代码， 其实都是运行在模块之中，
        // 所以 ES6 实际上把整个语言升级到了严格模式。
    </script>
</body>

</html>